﻿using System;
using System.Diagnostics;
using My.Ioc;

namespace NestedLifetimeScope
{
    #region Test Types

    public interface IDisposableClass : IDisposable
    {
    }

    public class DisposableClass : IDisposableClass
    {
        public DisposableClass()
        {
            Console.WriteLine("Instantiating DisposableClass...");
        }

        public void Dispose()
        {
            Console.WriteLine("Disposing DisposableClass...");
        }
    }

    public interface INonDisposableClass
    {
    }

    public class NonDisposableClass : INonDisposableClass
    {
        public NonDisposableClass()
        {
            Console.WriteLine("Instantiating NonDisposableClass...");
        }

        public void Dispose()
        {
            Console.WriteLine("Disposing NonDisposableClass...");
        }
    }

    #endregion

    class Program
    {
        static void Main(string[] args)
        {
            var container = new ObjectContainer(false);
            Register(container);
            Resolve(container);
            Console.ReadLine();
        }

        static void Register(IObjectContainer container)
        {
            container.Register<IDisposableClass, DisposableClass>().In(Lifetime.Scope());
            container.Register<INonDisposableClass, NonDisposableClass>();
            container.CommitRegistrations();
        }

        static void Resolve(IObjectContainer container)
        {
            using (var scope1 = container.BeginLifetimeScope())
            {
                IDisposableClass disposable1;
                IDisposableClass disposable2;

                disposable1 = scope1.Resolve<IDisposableClass>();
                using (var scope2 = scope1.BeginLifetimeScope())
                {
                    disposable2 = scope2.Resolve<IDisposableClass>();
                    Debug.Assert(disposable1 == disposable2, "disposable1 != disposable2");
                }

                var nonDisposable1 = scope1.Resolve<INonDisposableClass>();
                var nonDisposable2 = scope1.Resolve<INonDisposableClass>();
                Debug.Assert(nonDisposable1 != nonDisposable2, "nonDisposable1 == nonDisposable2");
            }
        }
    }
}
